﻿// Inner Fire 游戏引擎库
// DxDraw 渲染器绘制功能
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 用于DirectX的渲染器。
// 此文件分装用于绘制渲染的功能。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-04-23

#pragma once
#include <DirectXMath.h>
#include <dx/graphics/dx_draw_desc.h>
#include <dx/ui/ui_def.h>
#include <dx/view/dx_camera.h>

namespace ifire::dx {
class DxGraphics;

class DxDraw {
public:
  DxDraw(DxGraphics* dx);
  DxDraw(const DxDraw& rhs) = delete;
  DxDraw& operator=(const DxDraw& rhs) = delete;
  ~DxDraw() = default;

  // 进行绘制
  void Draw();

  // 得到绘制层
  eastl::vector<RenderItem*>& GetLayer(RenderLayer layer) {
    return draw_desc_.render_layers[(int)layer];
  }

  // ------
  // 属性访问
  // ------
  const DxDrawDesc& GetDesc() const { return draw_desc_; }
  void SetDesc(const DxDrawDesc& value) { draw_desc_ = value; }
  
  // 得到一个Pipeline，并且确定其已经编译
  ID3D12PipelineState* GetPipeline(const char* name);

private:
  // ------
  // 绘制相关Private
  // ------

  // 使用一个Pipeline绘制一个层。这个层如果没有任何东西，自然不绘制
  void DrawLayer(RenderLayer layer, const char* pipeline);

  void DrawRenderItems(const eastl::vector<RenderItem*>& items);
  void DrawRenderItem(RenderItem* item, ID3D12Resource* object_cb);
  void DrawShadowItems(const eastl::vector<RenderItem*>& items);
  void DrawSceneToShadowMap();
  void DrawNormalsAndDepth();
  void DrawFullscreenQuad();
  void DrawUI();
  void UpdateWavesGPU();

  DxGraphics* dx_;

  // 当前生效的Pipeline，如果是当前的Pipeline，则不进行改变
  const char* current_piepline;
  // 用于不需要在每个函数调用中传递
  ID3D12GraphicsCommandList* cmd;

  // 用于绘制的描述
  DxDrawDesc draw_desc_;
};

} // namespace ifire::dx